/*
Problem Description
RPG girls今天和大家一起去游乐场玩，终于可以坐上梦寐以求的过山车了。可是，过山车的每一排只有两个座位，而且还有条不成文的规矩，就是每个女生必须找个个男生做partner和她同坐。
但是，每个女孩都有各自的想法，举个例子把，Rabbit只愿意和XHD或PQK做partner，Grass只愿意和linle或LL做partner，PrincessSnow愿意和水域浪子或伪酷儿做partner。
考虑到经费问题，boss刘决定只让找到partner的人去坐过山车，其他的人，嘿嘿，就站在下面看着吧。聪明的Acmer，你可以帮忙算算最多有多少对组合可以坐上过山车吗？
Input
输入数据的第一行是三个整数K , M , N，分别表示可能的组合数目，女生的人数，男生的人数。0<K<=1000
1<=N 和M<=500.接下来的K行，每行有两个数，分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
Output
对于每组数据，输出一个整数，表示可以坐上过山车的最多组合数。
Sample Input
6 3 3
1 1
1 2
1 3
2 1
2 3
3 1
0
Sample Output
3
 */
package com.yuan.algorithms.training20150807;

import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Scanner;

/**
 * @author YouYuan
 * @eMail E-mail:1265161633@qq.com
 * @Time 创建时间：2015年8月23日 下午5:30:41
 * @Explain 说明:
 */
public class 二分图最大匹配_过山车 {

	static final int S = 505;
	static boolean[][] map = new boolean[S][S];//存储可匹配的组合
	static boolean[] mark = new boolean[S];//标记当前女生是否已经被匹配了
	static int[] p = new int[S];//记录当前女生匹配的男生编号
	static Scanner in = new Scanner(new BufferedInputStream(System.in));
	static int n, m;
	
	public static void main(String[] args) {
		while(in.hasNext()) {
			initialise();
			int k = in.nextInt();
			if (k == 0) {
				break;
			}
			n = in.nextInt();
			m = in.nextInt();
			for (int i = 0; i < k; i++) {
				int a = in.nextInt();
				int b = in.nextInt();
				map[a][b] = true;//记录a可以匹配b
			}
			int sum = 0;
			for (int i = 1; i <= n; i++) {//每个男生依次匹配一次
				Arrays.fill(mark, false);//重置女生的匹配标记，每个男生都可以匹配符合自己条件的女生
				if(find(i)) {
					sum++;
				}
			}
			System.out.println(sum);
		}
	}

	private static boolean find(int x) {
		for (int i = 1; i <= m; i++) {
			if (!map[x][i] || mark[i]) {//判断男生x是否可以和当前女生组合，并且当前女生没有被其他人匹配
				continue;//不满足条件则跳过当前女生
			}
			mark[i] = true;//标记当前女生已被匹配
			if (p[i] == 0 || find(p[i])) {//当前女生未匹配男生或者可以优化匹配(递归,重新匹配并成功腾出空间)
				p[i] = x;//记录当前女生匹配的男生
				return true;
			}
		}
		return false;
	}

	/**
	 * 初始化
	 */
	private static void initialise() {
		for(boolean t[] : map) {
			Arrays.fill(t, false);
		}
		Arrays.fill(mark, false);
		Arrays.fill(p, 0);
	}

}
